A proposta da pesquisa é verificar em quais circunstância o soft power indireto gerado pelas nações surge como uma condição suficiente, ou parte de uma combinação causal suficiente, para garantir a proximidade entre a política de dois Estados, sendo essa medida com base nos padrões de votação na Assembleia Geral da ONU. Além das variáveis supracitadas, isto é, o soft power indireto (variável causal de interesse) e a proximidade política (variável de resultado), serão também consideradas como possíveis variáveis causais as relações econômicas e militares existentes entre os pares de Estados analisados, sendo a metodologia escolhida para este estudo a Análise Qualitativa Comparada, em sua vertente de valores difusos (fsQCA).
A pesquisa utilizará os pacotes tidyverse, para limpeza,
organização e visualização dos dados; plotly, para tornar
interativos os gráficos criados com a função ggplot
(inclusa no tidyverse); rjson, para a coleta
de alguns dos dados que serão empregados; QCA, criado por
Adrian Dusa (2019)
com a finalidade explícita de realizar pesquisa empregando o método em
questão; e veen, para visualizar o diagrama de Venn criado
a partir da tabela verdade da pesquisa.
library(tidyverse)
library(plotly)
library(rjson)
library(QCA)
library(venn)
Conforme mencionado na introdução, para medir a proximidade política entre dois Estados serão utilizados os dados de votação na Assembleia Geral da ONU (AGNU), utilizados como padrão ouro em pesquisas dessa natureza por oferecerem dados mensuráveis e comparáveis ao longo dos anos. Esses dados já foram compilados pelos autores Voeten, Strezhnev, e Bailey (2009), estando disponíveis no repositório Harvard Dataverse.
O campo de código abaixo carrega a base de dados em questão no ambiente de trabalho:
load(url("https://dataverse.harvard.edu/api/access/datafile/4624865"))
head(dfAgree)
## # A tibble: 6 × 30
## # Groups: session.x, ccode1 [1]
## session.x ccode1 ccode2 agree year X.x NVotesAll.x IdealP…¹ QO.Al…² Q5.Al…³
## <int> <int> <int> <dbl> <dbl> <int> <int> <dbl> <dbl> <dbl>
## 1 1 2 20 0.854 1946 1 42 1.71 1.08 1.40
## 2 1 2 40 0.712 1946 1 42 1.71 1.08 1.40
## 3 1 2 41 0.568 1946 1 42 1.71 1.08 1.40
## 4 1 2 42 0.732 1946 1 42 1.71 1.08 1.40
## 5 1 2 70 0.566 1946 1 42 1.71 1.08 1.40
## 6 1 2 90 0.682 1946 1 42 1.71 1.08 1.40
## # … with 20 more variables: Q10.All.x <dbl>, Q50.All.x <dbl>, Q90.All.x <dbl>,
## # Q95.All.x <dbl>, Q100.All.x <dbl>, iso3c.x <chr>, Countryname.x <chr>,
## # X.y <int>, NVotesAll.y <int>, IdealPointAll.y <dbl>, QO.All.y <dbl>,
## # Q5.All.y <dbl>, Q10.All.y <dbl>, Q50.All.y <dbl>, Q90.All.y <dbl>,
## # Q95.All.y <dbl>, Q100.All.y <dbl>, iso3c.y <chr>, Countryname.y <chr>,
## # IdealPointDistance <dbl>, and abbreviated variable names ¹IdealPointAll.x,
## # ²QO.All.x, ³Q5.All.x
Nota-se nesse estágio que a pesquisa BBC/GlobeScan, utilizada aqui para medir o soft power dos Estados, envolveu apenas 10 países em suas duas dimensões - isto é, apenas indivíduos desses 10 países foram entrevistados para compor o índice e, simultaneamente, tiveram seu próprio país avaliado por audiências internacionais. Assim, são esses 10 Estados que serão utilizados como amostra para a pesquisa, recorrendo sempre a dados de 2017, ano no qual o índice BBC/GlobeScan foi elaborado.
Assim sendo, a base de dados sobre os padrões de votação na AGNU, tal qual todas que virão a seguir, podem ser filtradas para conter apenas as observações que serão relevantes para a análise. Igualmente, nem todas as variáveis contidas no banco de dados são relevantes, sendo possível filtrá-las.
countries <- c("BRA", "CAN", "CHN", "FRA", "DEU", "IND", "PAK", "RUS", "GBR", "USA")
un_data <- dfAgree %>%
ungroup() %>%
filter(year == 2017) %>%
filter(iso3c.x %in% countries) %>%
filter(iso3c.y %in% countries) %>%
select(iso3c.x,
iso3c.y,
agree,
IdealPointDistance)
head(un_data)
## # A tibble: 6 × 4
## iso3c.x iso3c.y agree IdealPointDistance
## <chr> <chr> <dbl> <dbl>
## 1 USA CAN 0.752 1.19
## 2 USA BRA 0.344 2.97
## 3 USA GBR 0.689 0.970
## 4 USA FRA 0.667 1.11
## 5 USA DEU 0.638 1.46
## 6 USA RUS 0.362 2.55
Para concluir a limpeza, é relevante criar uma variável com as siglas dos dois Estados (DyadCode), facilitando a identificação futura de cada caso:
un_data$DyadCode <- paste(un_data$iso3c.x, un_data$iso3c.y, sep = "+")
head(un_data)
## # A tibble: 6 × 5
## iso3c.x iso3c.y agree IdealPointDistance DyadCode
## <chr> <chr> <dbl> <dbl> <chr>
## 1 USA CAN 0.752 1.19 USA+CAN
## 2 USA BRA 0.344 2.97 USA+BRA
## 3 USA GBR 0.689 0.970 USA+GBR
## 4 USA FRA 0.667 1.11 USA+FRA
## 5 USA DEU 0.638 1.46 USA+DEU
## 6 USA RUS 0.362 2.55 USA+RUS
Para medir o soft power indireto de cada nação envolvida no estudo, recorre-se à pesquisa de opinião organizada através da parceria entre a empresa de consultoria GlobeScan e o Program for Public Consultation (PPC) da Universidade de Maryland, financiada pela BBC World News (2017). Especificamente, a pesquisa GlobeScan questiona aos entrevistados se eles percebem determinado Estado como uma influência majoritariamente positiva ou negativa no mundo, retornando dados sobre a percepção de cada Estado em cada país onde a pesquisa foi feita, além da percepção média observada para cada Estado.
Os dados extraídos da pesquisa GlobeScan foram compilados em um arquivo csv, disponibilizado entre os arquivos do projeto.
soft_power <- read.table("datasets/soft_power.csv", header = TRUE, sep = ";")
head(soft_power)
## iso3c.x iso3c.y Pos_x_over_y Pos_y_over_x Neg_x_over_y Neg_y_over_x DyadCode
## 1 BRA CAN 71 41 12 36 BRA+CAN
## 2 BRA CHN 45 57 38 34 BRA+CHN
## 3 BRA FRA 59 46 19 43 BRA+FRA
## 4 BRA DEU 63 6 18 16 BRA+DEU
## 5 BRA IND 23 32 57 21 BRA+IND
## 6 BRA PAK 5 16 81 23 BRA+PAK
Conforme mencionado na Introdução, a pesquisa também considera como possíveis variáveis causais as relações econômicas e militares existentes entre os pares de Estados analisados - as dinâmicas de hard power existente entre eles.
Como métrica para as relações econômicas, optou-se pela utilização do fluxo de comércio entre as partes, recorrendo a base de dados disponibilizada pelo UN Comtrade (2022). Por se tratar de um volume de dados extenso e dividido entre diversos data sets, optou-se por realizar a coleta através da API do UN Contrade.
O seguinte bloco de código é extraído diretamente do manual disponibilizado
pela própria plataforma. Ele define a função
get.Comtrade() que será utilizada para extrair os
dados.
get.Comtrade <- function(url="http://comtrade.un.org/api/get?"
,maxrec=50000
,type="C"
,freq="A"
,px="HS"
,ps="now"
,r
,p
,rg="all"
,cc="TOTAL"
,fmt="json"
)
{
string<- paste(url
,"max=",maxrec,"&" #maximum no. of records returned
,"type=",type,"&" #type of trade (c=commodities)
,"freq=",freq,"&" #frequency
,"px=",px,"&" #classification
,"ps=",ps,"&" #time period
,"r=",r,"&" #reporting area
,"p=",p,"&" #partner country
,"rg=",rg,"&" #trade flow
,"cc=",cc,"&" #classification code
,"fmt=",fmt #Format
,sep = ""
)
if(fmt == "csv") {
raw.data<- read.csv(string,header=TRUE)
return(list(validation=NULL, data=raw.data))
} else {
if(fmt == "json" ) {
raw.data<- fromJSON(file=string)
data<- raw.data$dataset
validation<- unlist(raw.data$validation, recursive=TRUE)
ndata<- NULL
if(length(data)> 0) {
var.names<- names(data[[1]])
data<- as.data.frame(t( sapply(data,rbind)))
ndata<- NULL
for(i in 1:ncol(data)){
data[sapply(data[,i],is.null),i]<- NA
ndata<- cbind(ndata, unlist(data[,i]))
}
ndata<- as.data.frame(ndata)
colnames(ndata)<- var.names
}
return(list(validation=validation,data =ndata))
}
}
}
Infelizmente, a API do UN Comtrade apresenta alguns limites para
usuários gratuitos, os quais impõem a necessidade de certas adequações
no código de coleta. Entre as limitações mais relevantes para a presente
pesquisa, destacam-se: (1) apenas uma solicitação pode ser feita por
segundo, com um máximo de 100 solicitações por hora; e (2) entre os
argumentos r (reporter), p (partner) e
ps (período temporal), se o valor de input não for
"all", então o número máximo de inputs é cinco. Partindo
dessas limitações técnicas, a forma mais simples de executar a coleta
dos dados parece ser um Estado de cada vez, sempre utilizando o input
"all" para o argumento partner, com a
subsequente filtragem das notações necessárias.
(Para mais detalhes sobre as limitações da API, consultar o manual).
O bloco de código abaixo define a função
get.Comtrade.ctdata(), utilizada para a coleta dos dados de
comércio de cada Estado da amostra. Ela recebe dois argumentos, sendo
eles o código ISO-alpha 3 e o código M49 referente a cada país. Por sua
vez, os blocos de código seguintes utilizam a mencionada função para
efetivamente coletar os dados que serão utilizados pela pesquisa.
get.Comtrade.ctdata <- function(state, reporter_code) {
Comtrade.countries <- c("WLD", countries)
x <- get.Comtrade(r = reporter_code, p = "All", ps = 2017, fmt = "csv")
as.data.frame(x$data) %>%
select(Trade.Flow, Reporter.ISO, Partner.ISO, Trade.Value..US..) %>%
filter(Partner.ISO %in% Comtrade.countries,
Partner.ISO != state,
Trade.Flow %in% c("Import", "Export")
)
}
#É comum o UN Comtrade apresentar instabilidade.
#Para facilitar a análise, o código de coleta foi desativado após os dados serem salvos nos arquivos do projeto.
#ct_bra <- get.Comtrade.ctdata("BRA", "76")
#write_csv(ct_bra, "datasets/UN_Comtrade_data/ct_bra.csv")
ct_bra <- read.table("datasets/UN_Comtrade_data/ct_bra.csv",
header = TRUE, sep = ",")
ct_bra
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import BRA WLD 165855231418
## 2 Export BRA WLD 214988108353
## 3 Import BRA CAN 1949757937
## 4 Export BRA CAN 2719391044
## 5 Import BRA CHN 29094836692
## 6 Export BRA CHN 47488449966
## 7 Import BRA FRA 4779106958
## 8 Export BRA FRA 2249926836
## 9 Import BRA DEU 9776468178
## 10 Export BRA DEU 4911018150
## 11 Import BRA PAK 57549907
## 12 Export BRA PAK 605230542
## 13 Import BRA RUS 2850168384
## 14 Export BRA RUS 2736531853
## 15 Import BRA IND 3118728509
## 16 Export BRA IND 4657327590
## 17 Import BRA GBR 2498535648
## 18 Export BRA GBR 2844277431
## 19 Import BRA USA 29288180655
## 20 Export BRA USA 27147587073
#ct_can <- get.Comtrade.ctdata("CAN", "124")
#write_csv(ct_can, "datasets/UN_Comtrade_data/ct_can.csv")
ct_can <- read.table("datasets/UN_Comtrade_data/ct_can.csv",
header = TRUE, sep = ",")
ct_can
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import CAN WLD 433045052733
## 2 Export CAN WLD 420074382189
## 3 Import CAN BRA 3634323371
## 4 Export CAN BRA 1318993241
## 5 Import CAN CHN 54652257046
## 6 Export CAN CHN 18185911190
## 7 Import CAN FRA 4771843301
## 8 Export CAN FRA 2625904722
## 9 Import CAN DEU 13856528608
## 10 Export CAN DEU 3094368204
## 11 Import CAN PAK 316574503
## 12 Export CAN PAK 575577308
## 13 Import CAN RUS 861087243
## 14 Export CAN RUS 517034731
## 15 Import CAN IND 3204370406
## 16 Export CAN IND 3296682348
## 17 Import CAN GBR 6859985097
## 18 Export CAN GBR 13633124740
## 19 Import CAN USA 222572824420
## 20 Export CAN USA 318570259928
#ct_chn <- get.Comtrade.ctdata("CHN", "156")
#write_csv(ct_chn, "datasets/UN_Comtrade_data/ct_chn.csv")
ct_chn <- read.table("datasets/UN_Comtrade_data/ct_chn.csv",
header = TRUE, sep = ",")
ct_chn
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import CHN WLD 1.843793e+12
## 2 Export CHN WLD 2.263371e+12
## 3 Import CHN BRA 5.885716e+10
## 4 Export CHN BRA 2.895054e+10
## 5 Import CHN CAN 2.042301e+10
## 6 Export CHN CAN 3.137545e+10
## 7 Import CHN FRA 2.680521e+10
## 8 Export CHN FRA 2.796350e+10
## 9 Import CHN DEU 9.694011e+10
## 10 Export CHN DEU 7.113440e+10
## 11 Import CHN PAK 1.833219e+09
## 12 Export CHN PAK 1.825079e+10
## 13 Import CHN RUS 4.139029e+10
## 14 Export CHN RUS 4.283060e+10
## 15 Import CHN IND 1.634537e+10
## 16 Export CHN IND 6.804225e+10
## 17 Import CHN GBR 2.232896e+10
## 18 Export CHN GBR 5.671352e+10
## 19 Import CHN USA 1.544419e+11
## 20 Export CHN USA 4.303281e+11
#ct_fra <- get.Comtrade.ctdata("FRA", "251")
#write_csv(ct_fra, "datasets/UN_Comtrade_data/ct_fra.csv")
ct_fra <- read.table("datasets/UN_Comtrade_data/ct_fra.csv",
header = TRUE, sep = ",")
ct_fra
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import FRA WLD 613132639717
## 2 Export FRA WLD 523385133284
## 3 Import FRA BRA 3331207869
## 4 Export FRA BRA 4717214172
## 5 Import FRA CAN 3517121418
## 6 Export FRA CAN 3564890179
## 7 Import FRA CHN 55401050257
## 8 Export FRA CHN 21292095767
## 9 Import FRA DEU 97082207072
## 10 Export FRA DEU 77609886141
## 11 Import FRA PAK 970866775
## 12 Export FRA PAK 607630592
## 13 Import FRA RUS 8606525189
## 14 Export FRA RUS 6292661255
## 15 Import FRA IND 6051924639
## 16 Export FRA IND 6037814785
## 17 Import FRA GBR 31123289033
## 18 Export FRA GBR 35050753878
## 19 Import FRA USA 39676920877
## 20 Export FRA USA 38414056721
#ct_deu <- get.Comtrade.ctdata("DEU", "276")
#write_csv(ct_deu, "datasets/UN_Comtrade_data/ct_deu.csv")
ct_deu<- read.table("datasets/UN_Comtrade_data/ct_deu.csv",
header = TRUE, sep = ",")
ct_deu
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import DEU WLD 1.167753e+12
## 2 Export DEU WLD 1.446642e+12
## 3 Import DEU BRA 8.446805e+09
## 4 Export DEU BRA 9.683114e+09
## 5 Import DEU CAN 4.593835e+09
## 6 Export DEU CAN 1.097580e+10
## 7 Import DEU CHN 1.164777e+11
## 8 Export DEU CHN 9.747448e+10
## 9 Import DEU FRA 7.305604e+10
## 10 Export DEU FRA 1.189321e+11
## 11 Import DEU PAK 1.900411e+09
## 12 Export DEU PAK 1.364074e+09
## 13 Import DEU RUS 2.540074e+10
## 14 Export DEU RUS 2.985072e+10
## 15 Import DEU IND 9.674712e+09
## 16 Export DEU IND 1.211342e+10
## 17 Import DEU GBR 4.095668e+10
## 18 Export DEU GBR 9.582774e+10
## 19 Import DEU USA 7.175558e+10
## 20 Export DEU USA 1.263669e+11
#ct_ind <- get.Comtrade.ctdata("IND", "699")
#write_csv(ct_ind, "datasets/UN_Comtrade_data/ct_ind.csv")
ct_ind <- read.table("datasets/UN_Comtrade_data/ct_ind.csv",
header = TRUE, sep = ",")
ct_ind
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import IND WLD 444052353836
## 2 Export IND WLD 294364490162
## 3 Import IND BRA 5104464250
## 4 Export IND BRA 2867436333
## 5 Import IND CAN 4844236758
## 6 Export IND CAN 2316419822
## 7 Import IND CHN 71922747817
## 8 Export IND CHN 12495230459
## 9 Import IND FRA 4931260139
## 10 Export IND FRA 5037498128
## 11 Import IND DEU 12665121178
## 12 Export IND DEU 8233600524
## 13 Import IND PAK 469331037
## 14 Export IND PAK 1789337609
## 15 Import IND RUS 7980558686
## 16 Export IND RUS 2138971950
## 17 Import IND GBR 4344085719
## 18 Export IND GBR 8954722988
## 19 Import IND USA 24086156632
## 20 Export IND USA 46018076640
#ct_pak <- get.Comtrade.ctdata("PAK", "586")
#write_csv(ct_pak, "datasets/UN_Comtrade_data/ct_pak.csv")
ct_pak <- read.table("datasets/UN_Comtrade_data/ct_pak.csv",
header = TRUE, sep = ",")
ct_pak
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import PAK WLD 57440012500
## 2 Export PAK WLD 21877787164
## 3 Import PAK BRA 612681684
## 4 Export PAK BRA 46750037
## 5 Import PAK CAN 638932961
## 6 Export PAK CAN 244887892
## 7 Import PAK CHN 15383397803
## 8 Export PAK CHN 1508079658
## 9 Import PAK FRA 667698804
## 10 Export PAK FRA 399939263
## 11 Import PAK DEU 1111487582
## 12 Export PAK DEU 1286490628
## 13 Import PAK RUS 310938248
## 14 Export PAK RUS 130895412
## 15 Import PAK IND 1696136475
## 16 Export PAK IND 334751881
## 17 Import PAK GBR 766014848
## 18 Export PAK GBR 1634955498
## 19 Import PAK USA 2842546760
## 20 Export PAK USA 3560300692
#ct_rus <- get.Comtrade.ctdata("RUS", "643")
#write_csv(ct_rus, "datasets/UN_Comtrade_data/ct_rus.csv")
ct_rus <- read.table("datasets/UN_Comtrade_data/ct_rus.csv",
header = TRUE, sep = ",")
ct_rus
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import RUS WLD 259966680280
## 2 Export RUS WLD 379206606018
## 3 Import RUS BRA 3240313961
## 4 Export RUS BRA 2658169828
## 5 Import RUS CAN 1071929629
## 6 Export RUS CAN 651403631
## 7 Import RUS CHN 56950375658
## 8 Export RUS CHN 41671349422
## 9 Import RUS FRA 10386846851
## 10 Export RUS FRA 6028246091
## 11 Import RUS DEU 28441062048
## 12 Export RUS DEU 26202990313
## 13 Import RUS PAK 286981263
## 14 Export RUS PAK 263166465
## 15 Import RUS IND 3094140016
## 16 Export RUS IND 7125588189
## 17 Import RUS GBR 4545303313
## 18 Export RUS GBR 8862350338
## 19 Import RUS USA 14282980847
## 20 Export RUS USA 11790525621
#ct_gbr <- get.Comtrade.ctdata("GBR", "826")
#write_csv(ct_gbr, "datasets/UN_Comtrade_data/ct_gbr.csv")
ct_gbr <- read.table("datasets/UN_Comtrade_data/ct_gbr.csv",
header = TRUE, sep = ",")
ct_gbr
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import GBR WLD 640907688603
## 2 Export GBR WLD 441847324214
## 3 Import GBR BRA 3130525619
## 4 Export GBR BRA 2320627874
## 5 Import GBR CAN 14870819750
## 6 Export GBR CAN 6231706274
## 7 Import GBR CHN 59860984044
## 8 Export GBR CHN 21382916068
## 9 Import GBR FRA 36458562716
## 10 Export GBR FRA 30381010916
## 11 Import GBR DEU 89639326173
## 12 Export GBR DEU 46663005497
## 13 Import GBR PAK 1634755403
## 14 Export GBR PAK 883603447
## 15 Import GBR RUS 7234127039
## 16 Export GBR RUS 3696871820
## 17 Import GBR IND 9179510043
## 18 Export GBR IND 5250483221
## 19 Import GBR USA 58827516056
## 20 Export GBR USA 59098116090
#ct_usa <- get.Comtrade.ctdata("USA", "842")
#write_csv(ct_usa, "datasets/UN_Comtrade_data/ct_usa.csv")
ct_usa <- read.table("datasets/UN_Comtrade_data/ct_usa.csv",
header = TRUE, sep = ",")
ct_usa
## Trade.Flow Reporter.ISO Partner.ISO Trade.Value..US..
## 1 Import USA WLD 2.405277e+12
## 2 Export USA WLD 1.545810e+12
## 3 Import USA BRA 3.055194e+10
## 4 Export USA BRA 3.732969e+10
## 5 Import USA CAN 3.056477e+11
## 6 Export USA CAN 2.824503e+11
## 7 Import USA CHN 5.257647e+11
## 8 Export USA CHN 1.297975e+11
## 9 Import USA FRA 5.004967e+10
## 10 Export USA FRA 3.421804e+10
## 11 Import USA DEU 1.199630e+11
## 12 Export USA DEU 5.356161e+10
## 13 Import USA PAK 3.762270e+09
## 14 Export USA PAK 2.808081e+09
## 15 Import USA RUS 1.777715e+10
## 16 Export USA RUS 7.002945e+09
## 17 Import USA IND 5.051929e+10
## 18 Export USA IND 2.564823e+10
## 19 Import USA GBR 5.417152e+10
## 20 Export USA GBR 5.624232e+10
A partir deste ponto, as bases de dados estão todas formatadas do
mesmo modo, contendo apenas as informações que serão de fato empregadas
na análise, isto é, os dados de importação e exportação. Entretanto,
como a pesquisa não demanda distinção da direção do fluxo do comércio,
vale a pena criar uma nova variável que agrupe os valores de importação
e exportação entre as díades de Estados. A forma mais fácil de fazer
isso é através das funções spread(), usada aqui para criar
as variáveis Export e Import a partir das
variáveis Trade.Flow e Trade.Value..US.., e
mutate(), usada para criar a nova variável
Total.Trade.Value_USD a partir das variáveis
Export e Import.
ct_bra <- ct_bra %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_can <- ct_can %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_chn <- ct_chn %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_deu <- ct_deu %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_fra <- ct_fra %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_gbr <- ct_gbr %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_ind <- ct_ind %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_pak <- ct_pak %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_rus <- ct_rus %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
ct_usa <- ct_usa %>%
spread(Trade.Flow, Trade.Value..US..) %>%
mutate(Total.Trade.Value_USD = Export + Import, .keep = "unused")
Agora as bases de dados apresentam apenas 3 valores: (1) o Estado que apresentou o report; (2) seu parceiro comercial; e (3) as trocas com esse parceiro em volume total de dólares norte-americanos (USD).
Nesse ponto, uma observação se faz relevante: em todos as observações, embora o valor em USD do fluxo comercial de x com y seja muito próximo do de y com x, estes nunca são iguais, mesmo que em tese devessem ser. Isso se deve pois o primeiro é calculado com base nos relatórios comerciais do Estado x, enquanto o segundo se baseia nos relatórios do Estado y, criando um cenário no qual pequenas inconsistências são inevitáveis.
Isto posto, o valor bruto dessas trocas comerciais é uma informação secundária, tendo em vista que o real interesse é em saber a proporção desse valor com relação ao fluxo comercial total desses Estados. Assim, foi optado pela manutenção dessas variáveis como estavam, tendo em vista que a informação mais relevante é o quão representativas são essas trocas comerciais em relação ao fluxo comercial destes Estados como um todo, a qual poderia ser negativamente afetada frente a qualquer tentativa de ajuste.
É importante ainda criar uma quarta variável,
Share_of_trade, estabelecida para cada díade com relação ao
total de trocas comerciais do Estado que apresentou o report. Feito
isso, a informação do total de trocas entre cada Estado e o resto do
mundo deixa de ser relevante, podendo ser filtrada para fora das bases
de dados.
BRA_WLD_trade <- ct_bra[ct_bra$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_bra <- ct_bra %>%
mutate(Share_of_trade = Total.Trade.Value_USD / BRA_WLD_trade) %>%
filter(Partner.ISO != "WLD")
CAN_WLD_trade <- ct_can[ct_can$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_can <- ct_can %>%
mutate(Share_of_trade = Total.Trade.Value_USD / CAN_WLD_trade) %>%
filter(Partner.ISO != "WLD")
CHN_WLD_trade <- ct_chn[ct_chn$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_chn <- ct_chn %>%
mutate(Share_of_trade = Total.Trade.Value_USD / CHN_WLD_trade) %>%
filter(Partner.ISO != "WLD")
DEU_WLD_trade <- ct_deu[ct_deu$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_deu <- ct_deu %>%
mutate(Share_of_trade = Total.Trade.Value_USD / DEU_WLD_trade) %>%
filter(Partner.ISO != "WLD")
FRA_WLD_trade <- ct_fra[ct_fra$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_fra <- ct_fra %>%
mutate(Share_of_trade = Total.Trade.Value_USD / FRA_WLD_trade) %>%
filter(Partner.ISO != "WLD")
GBR_WLD_trade <- ct_gbr[ct_gbr$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_gbr <- ct_gbr %>%
mutate(Share_of_trade = Total.Trade.Value_USD / GBR_WLD_trade) %>%
filter(Partner.ISO != "WLD")
IND_WLD_trade <- ct_ind[ct_ind$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_ind <- ct_ind %>%
mutate(Share_of_trade = Total.Trade.Value_USD / IND_WLD_trade) %>%
filter(Partner.ISO != "WLD")
PAK_WLD_trade <- ct_pak[ct_pak$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_pak <- ct_pak %>%
mutate(Share_of_trade = Total.Trade.Value_USD / PAK_WLD_trade) %>%
filter(Partner.ISO != "WLD")
RUS_WLD_trade <- ct_rus[ct_rus$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_rus <- ct_rus %>%
mutate(Share_of_trade = Total.Trade.Value_USD / RUS_WLD_trade) %>%
filter(Partner.ISO != "WLD")
USA_WLD_trade <- ct_usa[ct_usa$Partner.ISO == "WLD", "Total.Trade.Value_USD"]
ct_usa <- ct_usa %>%
mutate(Share_of_trade = Total.Trade.Value_USD / USA_WLD_trade) %>%
filter(Partner.ISO != "WLD")
Com todos os data frames devidamente configurados, podemos proceder
para sua junção em um único banco de dados, feita através da função
rbind().
ct_data <- rbind(ct_bra, ct_can, ct_chn, ct_deu, ct_fra, ct_gbr, ct_ind, ct_pak, ct_rus, ct_usa)
ct_data <- format(ct_data, scientific = FALSE)
head(ct_data)
## Reporter.ISO Partner.ISO Total.Trade.Value_USD Share_of_trade
## 1 BRA CAN 4669148981 0.0122600253
## 2 BRA CHN 76583286658 0.2010886857
## 3 BRA DEU 14687486328 0.0385656904
## 4 BRA FRA 7029033794 0.0184564966
## 5 BRA GBR 5342813079 0.0140288999
## 6 BRA IND 7776056099 0.0204179916
Agora a base apresenta as informações consolidadas do fluxo de comércio total do Estado x (Reporter.ISO) com o Estado y (Partner.ISO), além da porcentagem referente a parcela que esse fluxo comercial representa sobre a totalidade das trocas feitas pelo Estado x, com cada díade aparecendo duas vezes.Como a pesquisa vai recorrer tanto a porcentagem de trocas de x sobre y, quanto de y sobre x, é interessante agrupar esses dados na mesma linha.
Uma forma fácil de fazer isso é criando dois novos bancos de dados,
renomeando as variáveis Reporter.ISO e
Partner.ISO para Country_x e
Country_y, invertendo a atribuição de x e y em cada caso,
seguido de uma nova junção destes bancos de dados em um único, ancorado
nos valores de Country_x e Country_y.
Nota-se que o produto ainda será uma base de dados com 90 díades, com
cada uma se repetindo duas vezes, tal qual na base de dados das votações
na AGNU. Trata-se de um problema de fácil solução, tendo em vista que
basta introduzir a variável de DyadCode e, durante o
processo de união de todos os dataframes, eliminar as
observações que não constem no banco do GlobeScan, o qual já está
corretamente filtrado.
ct_a <- ct_data %>%
rename(Country_x = Reporter.ISO) %>%
rename(Country_y = Partner.ISO) %>%
rename(Share_x_with_y = Share_of_trade)
ct_b <- ct_data %>%
rename(Country_y = Reporter.ISO) %>%
rename(Country_x = Partner.ISO) %>%
rename(Share_y_with_x = Share_of_trade)
trade_data <- ct_a %>%
full_join(ct_b, by = c("Country_x","Country_y")) %>%
mutate(DyadCode = paste(Country_x,
Country_y, sep = "+")) %>%
select(DyadCode, Country_x, Country_y, Share_x_with_y, Share_y_with_x)
head(trade_data)
## DyadCode Country_x Country_y Share_x_with_y Share_y_with_x
## 1 BRA+CAN BRA CAN 0.0122600253 0.0058061233
## 2 BRA+CHN BRA CHN 0.2010886857 0.0213791573
## 3 BRA+DEU BRA DEU 0.0385656904 0.0069346498
## 4 BRA+FRA BRA FRA 0.0184564966 0.0070816508
## 5 BRA+GBR BRA GBR 0.0140288999 0.0050345216
## 6 BRA+IND BRA IND 0.0204179916 0.0107959355
O aspecto do hard power que diz respeito as relações militares entre os Estados é de difícil mensuração. Embora o conceito seja originalmente definido no sentido de ameaça do uso da força, métricas nesse sentido são raras e, em geral, imprecisas. Opta-se ao invés disso por usar o padrão de alianças militares entre os Estados como uma variável proxy, tendo em vista que a existência dessas reduz drasticamente as chances do uso da força nas relações entre dois países. Para tanto, será utilizado o banco de dados Formal Alliances (v4.1), disponível como parte do projeto The Correlates of War.
Embora sua última atualização remeta ao ano de 2012, sendo, portanto, cinco anos mais antiga que os demais dados aqui trabalhados, a análise tende a não ser prejudicada, haja visto que se trata de uma métrica muito estável. Conforme demonstrado abaixo, mesmo se considerarmos o ano de 2012 como ponto final de todas as alianças então correntes, a duração média dessas alianças é de aproximadamente 22 anos.
cow_avg <- read.table("datasets/alliance_v4.1_by_dyad.csv", header=T, sep=",") %>%
mutate(dyad_end_year = ifelse(is.na(dyad_end_year), 2012, dyad_end_year),
years_duration = dyad_end_year - dyad_st_year) %>%
summarise(mean(years_duration))
cow_avg
## mean(years_duration)
## 1 22.00714
Avançando para a coleta destes dados propriamente dita, nota-se que, dos quatro arquivos disponibilizados pelo COW referentes a esse dataset, o “alliance_v4.1_by_directed_yearly.csv” é o que apresenta as informações mais detalhadas, incluindo uma observação para cada ano no qual a aliança permaneceu ativa. Isso permite facilmente realizar a filtragem dos dados para conter apenas as alianças entre os Estados da amostra e que estavam ativas em 2012.
cow_countries <- c("Brazil", "Canada", "China", "France", "Germany", "India", "Pakistan", "Russia", "United Kindom", "United States of America")
cow_data <- read.table("datasets/alliance_v4.1_by_dyad_yearly.csv", header=T, sep=",") %>%
filter(year == 2012,
state_name1 %in% cow_countries,
state_name2 %in% cow_countries) %>%
select(state_name1, state_name2, defense, neutrality, nonaggression, entente)
head(cow_data)
## state_name1 state_name2 defense neutrality nonaggression entente
## 1 United States of America Canada 1 0 1 1
## 2 United States of America Brazil 1 0 1 1
## 3 Canada Brazil 1 0 1 1
## 4 United States of America Canada 1 0 1 1
## 5 United States of America France 1 0 1 1
## 6 United States of America Germany 1 0 1 1
Diferente dos demais dados que serão utilizados, a base do COW não apresenta os códigos ISO-alpha 3 para os Estados, empregando apenas seu nome por extenso. Para a facilitar a futura junção das diferentes bases de dados, uma padronização é necessária para concluir a limpeza.
cow_data[cow_data == "Brazil"] <- "BRA"
cow_data[cow_data == "Canada"] <- "CAN"
cow_data[cow_data == "China"] <- "CHN"
cow_data[cow_data == "France"] <- "FRA"
cow_data[cow_data == "Germany"] <- "DEU"
cow_data[cow_data == "India"] <- "IND"
cow_data[cow_data == "Pakistan"] <- "PAK"
cow_data[cow_data == "Russia"] <- "RUS"
cow_data[cow_data == "United Kindom"] <- "GBR"
cow_data[cow_data == "United States of America"] <- "USA"
cow_data_1 <- cow_data %>%
rename(iso3c.x = state_name1, iso3c.y = state_name2)
cow_data_2 <- cow_data %>%
rename(iso3c.y = state_name1, iso3c.x = state_name2)
cow_data <- rbind(cow_data_1, cow_data_2)
cow_data <- cow_data %>%
mutate(DyadCode = paste(cow_data$iso3c.x,
cow_data$iso3c.y, sep = "+"))
head(cow_data)
## iso3c.x iso3c.y defense neutrality nonaggression entente DyadCode
## 1 USA CAN 1 0 1 1 USA+CAN
## 2 USA BRA 1 0 1 1 USA+BRA
## 3 CAN BRA 1 0 1 1 CAN+BRA
## 4 USA CAN 1 0 1 1 USA+CAN
## 5 USA FRA 1 0 1 1 USA+FRA
## 6 USA DEU 1 0 1 1 USA+DEU
Conforme já mencionado, uma questão comum nas bases de dados trabalhadas é a duplicidade dos valores referentes as díades. Os dados relacionais entre Brasil e China, por exemplo, aparecem duas vezes, primeiro com o DyadCode BRA+CHN; depois como CHN+BRA. Apesar da ordem invertida, os dados são os mesmos, sendo aconselhável filtrar a versão dobrada. Felizmente, os dados da pesquisa BBC / Globescan estão corretos, podendo servir de base para a filtragem das demais bases.
clean_set <- soft_power %>%
select(DyadCode)
un_data <- clean_set %>%
inner_join(un_data, by = "DyadCode")
Uma vez filtrada, a base de dados sobre os padrões de votação na AGNU agora traz duas informações relevantes: a % de concordância entre os pares de Estados; e seu ideal point distance (IPD) naquele ano.
Como Bailey, Strezhnev e Voeten (2009) apontam, o IPD é uma métrica mais apropriada para medir o posicionamento dos Estados, tendo em vista que seu cálculo considera potenciais alterações na agenda da AGNU entre as sessões, razão pela qual a pesquisa opta por seu uso. Nota-se ainda que, quanto maior o IPD entre dois países, mais distintos são seus padrões de voto.
Assim, o primeiro passo na análise parece ser verificar como se distribuem ao logo da amostra os IPD entre os pares de Estados que estão sendo considerados.
g1 <- ggplot(un_data, aes(x = reorder(DyadCode, -IdealPointDistance), y = IdealPointDistance))+
geom_histogram(stat = "identity", alpha = 0.6, fill = "#66adff")+
theme_minimal()+
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank())+
labs(title = "IPD entre os pares de Estados",
subtitle = "2017",
caption="Dados de Voeten, Strezhnev e Bailey (2009).",
y = "IPD",
x = "Pares de Estados")
ggplotly(g1)
É possível notar três grupos distintos, sendo eles: (1) pares de Estados com uma discordância inferior a 0.5; (2) pares com uma discordância superior a 2.5; e (3) pares cuja discordância flutua entre, aproximadamente, 1 e 2 pontos - isto é, Estados que sistematicamente votam de forma similar; Estados que sistematicamente adotam posições antagônicas; e Estados cujas posições parecem ser independentes.
Um padrão similar surge ao considerarmos a relação entre a similaridade dos votos e porcentagem de concordância:
un_data <- un_data %>%
mutate(group = ifelse(IdealPointDistance > 2.5, "Próximos",
ifelse(IdealPointDistance < 0.5, "Antagônicos",
"Independentes")))
g2 <- ggplot(un_data, aes(x = IdealPointDistance,
y = agree,
label = DyadCode,
color = group))+
geom_point()+
theme_minimal()+
scale_color_manual(values=c("#619CFF", "#00BA38", "#F8766D"))+
theme(legend.position = "none")+
labs(title = "IPD vs. Similaridade dos votos entre as díades",
subtitle = "2017",
caption="Dados de Voeten, Strezhnev e Bailey (2009).",
x = "IPD",
y = "Similaridade (% de concordância)")
ggplotly(g2, tooltip = c("DyadCode", "IdealPointDistance"))
Nota-se que o fsQCA demanda o estabelecimento de três limiares qualitativos para cada variável considerada na análise, representando os limiares de completa adesão dos casos ao conjunto que a variável representa [1]; sua completa exclusão do conjunto [0]; e o ponto de máxima ambiguidade entre pertencimento e exclusão [0.5].
Assim, no caso da variável em questão, opta-se por considerar um IPD de 0.5 como limiar de pleno pertencimento pleno ao conjunto de díades politicamente próximas; 2.5 como limiar de plena exclusão do conjunto; e 1.5 como o ponto de máxima ambiguidade.
Com base nesses limiares qualitativos, se avança para a calibração
dos dados para os valores difusos que serão empregados. Para tanto,
emprega-se a função calibrate, disponível como parte do
pacote QCA, de autoria de Adrian Dusa (2019),
onde:
type se refere ao tipo de calibração (“crisp” ou
“fuzzy”), aqui sendo empregada a modalidade fuzzy;method se refere ao método da calibração (“direct” ou
“indirect”), aqui sendo empregado o método direto; ethresholds se referem as âncoras qualitativas
empregadas, sendo “e” referente ao ponto de exclusão do conjunto (0.05),
“c” ao ponto de máxima ambiguidade (0.5), e “i” ao ponto de plena
inclusão no conjunto (0.95).O bloco de código abaixo calibra os dados em questão com os valores supracitados, seguido da apresentação gráfica do conjunto de dados calibrados.
un_data$fs_unvotes <- calibrate(un_data$IdealPointDistance, type = "fuzzy", method = "direct", thresholds = "e=2.5, c=1.5, i=0.5")
g3 <- ggplot(un_data, aes(x = IdealPointDistance,
y = fs_unvotes,
label = DyadCode))+
geom_point()+
theme_minimal()+
labs(title = "Proximidade na AGNU - calibração fuzzy",
subtitle = "2017",
caption="Baseado nos dados de Voeten, Strezhnev e Bailey (2009).",
x = "IPD",
y = "Valor fuzzy")+
geom_vline(xintercept = 0.5, col = "red", alpha = 0.6, linetype="dashed")+
geom_vline(xintercept = 2.5, col = "red", alpha = 0.6, linetype="dashed")+
geom_vline(xintercept = 1.5, col = "red", alpha = 0.6, linetype="dashed")
ggplotly(g3)
A teoria fornece poucas indicações do tratamento que deve ser dado às opiniões negativas, apenas sugerindo que estas podem afetar o soft power de uma nação tanto quanto as opiniões positivas das populações de outros Estados sobre a nação em questão (Nye, 2004). Assim, será feita a opção por desagregar a análise em duas variáveis, trabalhando inicialmente apenas com as opiniões positivas (atração).
Diferente da variável anterior, que apresenta um único valor para cada díade, a métrica utilizada para medir o soft power indireto existente entre os Estados oferece dois valores, sendo eles a porcentagem da população do país x que apresenta uma visão positiva do país y; e a porcentagem da população do país y que apresenta uma visão positiva do país x. Sendo as relações de poder um fenômeno relacional por definição, opta-se por trabalhar com as médias das opiniões positivas registradas em cada díade, haja visto que ambas as populações nutrindo uma opinião positiva sobre o outro país deve fortalecer de ambos os lados os incentivos para que seus governos aproximem suas políticas externas, tornando essa aproximação mais provável.
soft_power$avg_p <- (soft_power$Pos_x_over_y + soft_power$Pos_y_over_x)/2
p_views <- soft_power %>%
select(DyadCode, avg_p)
head(p_views)
## DyadCode avg_p
## 1 BRA+CAN 56.0
## 2 BRA+CHN 51.0
## 3 BRA+FRA 52.5
## 4 BRA+DEU 34.5
## 5 BRA+IND 27.5
## 6 BRA+PAK 10.5
Recortado apenas as avaliações positivas e obtendo valor máximo para cada díade, se avança para a análise gráfica da variável em questão, começando por sua distribuição ao logo da amostra.
g4 <- ggplot(p_views, aes(x = reorder(DyadCode, -avg_p), y = avg_p))+
geom_bar(stat = "identity", alpha = 0.6, fill = "#619CFF")+
theme_minimal()+
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank())+
labs(title = "Opiniões positivas - Valor médio entre as díades",
subtitle = "2017",
caption="Pesquisa BBC/GlobeScan (2017).",
y = "% de respondentes",
x = element_blank())
ggplotly(g4)
Considera-se que mesmo entre os países que não são uma democracia, o índice médio de 50% de opiniões positivas em uma díade deve fornecer incentivos fortes o suficiente para a criação de um ambiente favorável a aproximação de suas políticas externas - ao menos partindo do pressuposto que o soft power indireto funcionará conforme previsto por Nye (2004). Por outro lado, índices inferiores a 5% devem apresentar situações nas quais as populações destes Estados não apresentem qualquer pressão relevante por uma aproximação entre seus Estados, tornando-os, efetivamente, independentes do soft power indireto gerado por qualquer uma das partes. Por sua vez, uma média próxima a 1/3 das populações desses Estados apresentando opiniões positivas sobre o outro parece apresentar o ponto máximo de ambiguidade.
Assim, se estabelece como 50% o limiar para o completo pertencimento de casos ao conjunto de díades com opiniões positivas favoráveis; 5% como o limiar para a completa exclusão do conjunto; e 33% como o ponto de máxima ambiguidade.
p_views$fs_pviews <- calibrate(p_views$avg_p, type = "fuzzy", method = "direct", thresholds = "e=5, c=33, i=50")
g5 <- ggplot(p_views, aes(x = avg_p, y = fs_pviews, label = DyadCode))+
geom_point()+
theme_minimal()+
labs(title = "Opiniões positivias - calibração fuzzy",
subtitle = "2017",
caption="Baseado nos dados da pesquisa BBC/GlobeScan (2017).",
x = "% de opiniões positivas",
y = "Valor fuzzy")+
geom_vline(xintercept = 50, col = "red", alpha = 0.6, linetype="dashed")+
geom_vline(xintercept = 33, col = "red", alpha = 0.6, linetype="dashed")+
geom_vline(xintercept = 5, col = "red", alpha = 0.6, linetype="dashed")
ggplotly(g5)
Concluída a calibração das opiniões positivas, avançamos para a segunda variável relativa ao soft power nacional, isto é, as opiniões negativas que cada país analisado desperta nas populações dos demais.
soft_power$avg_n <- (soft_power$Neg_x_over_y + soft_power$Neg_y_over_x)/2
n_views <- soft_power %>%
select(DyadCode, avg_n)
head(n_views)
## DyadCode avg_n
## 1 BRA+CAN 24
## 2 BRA+CHN 36
## 3 BRA+FRA 31
## 4 BRA+DEU 17
## 5 BRA+IND 39
## 6 BRA+PAK 52
Avançando para a análise gráfica da variável em questão, têm-se:
g6 <- ggplot(n_views, aes(x = reorder(DyadCode, -avg_n), y = avg_n))+
geom_bar(stat = "identity", alpha = 0.6, fill = "#F8766D")+
theme_minimal()+
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank())+
labs(title = "Opiniões negativas - Valor médio entre as díades",
subtitle = "2017",
caption="Pesquisa GlobeScan (2017).",
y = "% de respondentes",
x = element_blank())
ggplotly(g6)
Como no caso anterior, essa variável também extraí seus dados da pesquisa BBC / GlobeScan, com a mesma lógica sendo aplicável, tomando o limiar médio de 50% para definir quando as opiniões negativas entre uma díade são fortes o suficiente para criar incentivos contrários a aproximação de suas políticas externas. Igualmente, toma-se os índices inferiores a 5% para definir situações livres de pressão por um afastamento e 33% como ponto máximo de ambiguidade.
n_views$fs_nviews <- calibrate(n_views$avg_n, type = "fuzzy", method = "direct", thresholds = "e=5, c=33, i=50")
g7 <- ggplot(n_views, aes(x = avg_n, y = fs_nviews, label = DyadCode))+
geom_point()+
theme_minimal()+
labs(title = "Opiniões negativas - calibração fuzzy",
subtitle = "2017",
caption="Baseado nos dados da pesquisa BBC/GlobeScan (2017).",
x = "% de opiniões negativas",
y = "Valor fuzzy")+
geom_vline(xintercept = 50, col = "red", alpha = 0.6, linetype="dashed")+
geom_vline(xintercept = 33, col = "red", alpha = 0.6, linetype="dashed")+
geom_vline(xintercept = 5, col = "red", alpha = 0.6, linetype="dashed")
ggplotly(g7)
De forma semelhante ao notado nas variáveis associadas ao soft power nacional, o fluxo de comércio também apresenta dois valores para os Estados de cada díade, referentes a porcentagem que um Estado x representa do total das trocas comerciais com o Estado y e vice-versa. Assim, considerando a necessidade de agregar esses valores em uma única métrica que faça sentido na análise relacional proposta, o mesmo tratamento será aplicado, baseando a análise no valor médio entre os dois valores apresentados.
trade_data <- clean_set %>%
inner_join(trade_data, by = "DyadCode")
trade_data$Share_x_with_y <- as.numeric(trade_data$Share_x_with_y)
trade_data$Share_y_with_x <- as.numeric(trade_data$Share_y_with_x)
trade_data$avg_trade <- (trade_data$Share_x_with_y + trade_data$Share_y_with_x)/2
trade_data <- trade_data %>%
select(DyadCode, avg_trade)
head(trade_data)
## DyadCode avg_trade
## 1 BRA+CAN 0.009033074
## 2 BRA+CHN 0.111233921
## 3 BRA+FRA 0.012769074
## 4 BRA+DEU 0.022750170
## 5 BRA+IND 0.015606964
## 6 BRA+PAK 0.005027045
g8 <- ggplot(trade_data, aes(x = reorder(DyadCode, -avg_trade), y = avg_trade))+
geom_histogram(stat = "identity", alpha = 0.5, fill = "#00BA38")+
theme_minimal()+
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank())+
scale_y_continuous(labels = scales::percent)+
labs(
title = "% das trocas comerciais - Valor médio entre as díades de Estados",
subtitle = "2017",
caption="UN Comtrade (2022).",
y = element_blank(),
x = element_blank())
ggplotly(g8)
É relevante notar que essa métrica ignora aspectos como a importância estratégica de cada produto, além não considerar outros aspectos das relações econômicas entre as partes, sobretudo no setor de investimentos. Essa também é sem dúvida a variável com a ancoragem qualitativa mais complexa, com a teoria base fornecendo poucos indícios para os limiares demandados pelo QCA. Essa variável deve assim ser tomada como uma proxy um tanto problemática, a qual, idealmente, deve ser substituída por métricas mais confiáveis no futuro, caso essas se tornem acessíveis.
Isto posto, se adotará como limiares qualitativos os valores de 0.15 (15%) para determinar a dependência de uma economia sobre a outra; 0.01 (1%) como limiar de independência entre os mercados; e 0.075 (7.5%) como ponto de máxima ambiguidade.
trade_data$fs_trade <- calibrate(trade_data$avg_trade, type = "fuzzy", method = "direct", thresholds = "e=0.01, c=0.075, i=0.15")
g9 <- ggplot(trade_data, aes(x = avg_trade, y = fs_trade, label = DyadCode))+
geom_point()+
theme_minimal()+
labs(title = "Trocas comerciais - calibração fuzzy",
subtitle = "2017",
caption="Baseado nos dados do UN Comtrade (2022).",
x = "% das trocas comerciais",
y = "Valor fuzzy")+
geom_vline(xintercept = 0.15, col = "red", alpha = 0.6, linetype="dashed")+
geom_vline(xintercept = 0.075, col = "red", alpha = 0.6, linetype="dashed")+
geom_vline(xintercept = 0.01, col = "red", alpha = 0.6, linetype="dashed")
ggplotly(g9)
O banco de dados do Correlates of War (COW) oferece informações sobre quatro tipos distintos de alianças formais entre Estados, sendo:
Conforme apontado por Douglas Gibler (2009), pesquisador responsável pelo dataset em questão, há um certo grau de hierarquia entre os tipos de aliança, com o tratado de defesa no topo, seguido pelo de neutralidade, não-agressão e o de entente, com os tratados de hierarquias superiores comumente incluindo cláusulas referentes ao demais tipos. Assim, de certo modo, a própria base de dados oferece os limiares necessários para a realização do QCA. Destarte, opta-se pela utilização, nesse caso específico, do método de calibração fuzzy indireto, estabelecendo os tratados de defesa como o limiar qualitativo de pleno pertencimento de cada díade no conjunto de Estados que são aliados (1); os tratados de neutralidade (0.8) e não-agressão (0.6) como casos que estão mais dentro do que fora do conjunto; o tratado de entente (0.4) como casos que estão mais fora do que dentro do conjunto; e a inexistência de qualquer tratado como limiar de plena exclusão (0).
O bloco de códigos abaixo organiza a base de dados de acordo com o os parâmetros estabelecidos acima.
cow_data <- cow_data %>%
mutate(fs_alliance = ifelse(defense == 1, 1,
ifelse(neutrality == 1, 0.8,
ifelse(nonaggression == 1, 0.6,
ifelse(entente == 1, 0.4, 0))))) %>%
select(DyadCode, fs_alliance) %>%
distinct(.keep_all = FALSE) %>%
right_join(clean_set, by = "DyadCode") %>%
replace(is.na(.), 0)
head(cow_data)
## DyadCode fs_alliance
## 1 CAN+FRA 1.0
## 2 CAN+DEU 1.0
## 3 FRA+DEU 1.0
## 4 IND+PAK 0.6
## 5 DEU+RUS 0.8
## 6 FRA+RUS 0.4
Com o data frame configurado, a tabela abaixo apresenta a distribuição dos casos da amostra:
tibble(
Limiares_qualitativos = c("Díades com tratados de defesa [1]",
"Díades com tratados de neutralidade [0.8]",
"Díades com tratados de não-agressão [0.6]",
"Díades com tratados de entente [0.4]",
"Díades sem tratados militares [0]"),
Frequência = c(
(nrow(subset(cow_data, fs_alliance == 1))),
(nrow(subset(cow_data, fs_alliance == 0.8))),
(nrow(subset(cow_data, fs_alliance == 0.6))),
(nrow(subset(cow_data, fs_alliance == 0.4))),
(nrow(subset(cow_data, fs_alliance == 0)))
)
)
## # A tibble: 5 × 2
## Limiares_qualitativos Frequência
## <chr> <int>
## 1 Díades com tratados de defesa [1] 9
## 2 Díades com tratados de neutralidade [0.8] 2
## 3 Díades com tratados de não-agressão [0.6] 3
## 4 Díades com tratados de entente [0.4] 1
## 5 Díades sem tratados militares [0] 30
Com todos os bancos de dados coletados e calibrados, podemos proceder para a junção desse material em um único banco de dados, o qual servirá de base para a construção da tabela verdade da análise.
qca_data <- clean_set %>%
inner_join(un_data, by = "DyadCode") %>%
inner_join(p_views, by = "DyadCode") %>%
inner_join(n_views, by = "DyadCode") %>%
inner_join(trade_data, by = "DyadCode") %>%
inner_join(cow_data, by = "DyadCode") %>%
select(DyadCode, fs_unvotes, fs_pviews, fs_nviews, fs_trade, fs_alliance)
head(qca_data)
## DyadCode fs_unvotes fs_pviews fs_nviews fs_trade fs_alliance
## 1 BRA+CAN 0.3076159 0.98172277 0.2796040 0.04796000 1
## 2 BRA+CHN 0.9855611 0.95761459 0.6270558 0.80573227 0
## 3 BRA+FRA 0.2582520 0.96699214 0.4476137 0.05630591 0
## 4 BRA+DEU 0.4931461 0.56458797 0.1567599 0.08573430 0
## 5 BRA+IND 0.9833963 0.35930730 0.7386983 0.06353931 0
## 6 BRA+PAK 0.9848704 0.08579712 0.9641134 0.04032167 0
Com os dados consolidados, o próximo passo é realizar a análise de
necessidade das variáveis causais para a presença da variável de
resultado. Conforme sugerido por Schneider e Wagemann (2007), adota-se
um patamar de consistência mínimo de 0.9 para considerar uma condição
como necessária. Esses valores podem ser obtidos através da função
pof, onde setms se refere a variável de
interesse; outcome a variável de resultado; e
relation a relação que se busca entre os dois conjuntos -
no caso, da variável de interesse ser necessária para a ocorrência da
variável de resultado.
n1 <- pof(setms = qca_data$fs_pviews,
outcome = qca_data$fs_unvotes,
relation = "necessity")
n1 <- as.data.frame(n1$incl.cov)
n2 <- pof(setms = qca_data$fs_nviews,
outcome = qca_data$fs_unvotes,
relation = "necessity")
n2 <- as.data.frame(n2$incl.cov)
n3 <- pof(setms = qca_data$fs_trade,
outcome = qca_data$fs_unvotes,
relation = "necessity")
n3 <- as.data.frame(n3$incl.cov)
n4 <- pof(setms = qca_data$fs_alliance,
outcome = qca_data$fs_unvotes,
relation = "necessity")
n4 <- as.data.frame(n4$incl.cov)
necessity <- rbind(n1, n2, n3, n4) %>%
rename(Consistência = inclN) %>%
rename(Relevância = RoN) %>%
rename(Cobertura = covN) %>%
print()
## Consistência Relevância Cobertura
## fs_pviews 0.7382677 0.6234197 0.6670847
## fs_nviews 0.6066400 0.6658271 0.6205556
## fs_trade 0.3342466 0.9351489 0.7885090
## fs_alliance 0.3373280 0.8905522 0.6908328
Embora o índice de relevância de algumas variáveis seja elevado (ver Schneider e Wagemann, 2007), a consistência de todas elas fica muito abaixo do índice de 0.9 recomendável para uma variável causal ser considerada necessária para o resultado, de modo que elas podem ser descartadas enquanto variáveis necessárias.
Avançando para a análise de suficiência, essa é conduzida com base da
tabela verdade, principal ferramenta analítica do QCA, realizada aqui
através da função truthTable, onde:
outcome determina à variável dependente, no caso os
padrões de voto na AGNU;conditions se refere às variáveis independetes; eincl.cut estabelece a consistência mínima para
determinada configuração ser considerada positiva, adotando aqui o valor
mínimo de 0.8 sugerido por Ragin (2008) como consistência padrão para
condições suficientes em fuzzy sets.row.names(qca_data) <- qca_data$DyadCode #identifica os casos por sua DyadCode, facilitando a visualização na tabela verdade.
truth_table <- truthTable(qca_data, outcome = "fs_unvotes",
conditions = "fs_pviews, fs_nviews, fs_trade,
fs_alliance",
incl.cut = 0.8)
truth_table
##
## OUT: output value
## n: number of cases in configuration
## incl: sufficiency inclusion score
## PRI: proportional reduction in inconsistency
##
## fs_pviews fs_nviews fs_trade fs_alliance OUT n incl PRI
## 1 0 0 0 0 1 1 0.953 0.865
## 5 0 1 0 0 0 11 0.741 0.566
## 6 0 1 0 1 0 4 0.710 0.552
## 7 0 1 1 0 0 1 0.720 0.435
## 9 1 0 0 0 1 10 0.803 0.665
## 10 1 0 0 1 1 4 0.862 0.794
## 11 1 0 1 0 1 1 0.931 0.870
## 12 1 0 1 1 1 4 0.954 0.928
## 13 1 1 0 0 0 5 0.718 0.473
## 14 1 1 0 1 1 1 0.841 0.646
## 15 1 1 1 0 1 1 0.865 0.758
## 16 1 1 1 1 0 1 0.753 0.543
A partir da tabela verdade criada, é possível gerar um diagrama de Venn apresentando os resultados de todas as possíveis combinações das variáveis causais.
venn(truth_table, ellipse = TRUE, ilabels = TRUE)
Finalmente, através da função minimize podemos reduzir a
complexidade da solução e apresentar os caminhos de suficiência causal,
nos quais a combinação da presença das variáveis independentes são
suficientes para a produção da variável dependente.
minimize(truth_table, include = "?", details = TRUE)
##
## M1: ~fs_nviews + fs_pviews*~fs_trade*fs_alliance +
## fs_pviews*fs_trade*~fs_alliance -> fs_unvotes
##
## inclS PRI covS covU
## --------------------------------------------------------------
## 1 ~fs_nviews 0.830 0.744 0.613 0.307
## 2 fs_pviews*~fs_trade*fs_alliance 0.791 0.694 0.202 0.040
## 3 fs_pviews*fs_trade*~fs_alliance 0.885 0.814 0.219 0.036
## --------------------------------------------------------------
## M1 0.804 0.714 0.692
Três soluções causais emergem como suficientes para a produção do resultado, sendo:
A ausência de um índice elevado de opiniões negativas entre os Estados;
A presença de um índice elevado de opiniões positivas entre os Estados acompanhada de uma aliança militar e da ausência de uma interdependência econômica; e
A presença de um índice elevado de opiniões positivas entre os Estados acompanhada de uma interdepêndencia econômica e da ausência de uma aliança militar entre as partes.
Os três casos incluem variáveis associadas ao soft power indireto, seja através da ausência de uma repulsa entre as populações desses Estados (solução 1) ou da presença de atração entre essas populações acompanhada de alguma outra variável causal (soluções 2 e 3), reforçando a importância do fenômeno para a compreensão das relações entre os Estados.
Bailey, M. A., Strezhnev, A. and Voeten, E. (2009) ‘United Nations General Assembly Voting Data’, Harvard Database, 18. doi: https://doi.org/10.7910/DVN/LEJUQZ.
BBC and GlobeScan (2017) Sharp Drop in World Views of US, UK: Global Poll. Available at: https://globescan.com/sharp-drop-in-world-views-of-us-uk-global-poll/#backgrounder-country-by-country-results (Accessed: 22 October 2022).
Duşa, A. (2019) QCA with R - A Comprehensive Resource. New York: Springer.
Gibler, D. M. (2009) ‘International military alliances, 1648-2008’, Congressional Quarterly Press, (v4.1).
Nye, J. (2004) Soft Power: The Means to Sucess in World Politics. Cambridge: Public Affairs.
United Nations (2022) UN Comtrade Database. Available at: https://comtrade.un.org/data/ (Accessed: 22 October 2022).